/***********************************************************************************
 * 文件名： cap_sensor_config.h
 * 版本： 2
 * 说明：
 * 		纯软件实现的电容传感器组件，可以看做是一个转换的模拟量是电容值的ADC，可以利用普通IO口
 * 	测量电容。转换的结果只是一个采样值，这个值对应的电容值需要与基准电容的采样值进行比较才能准
 * 	确算出电容值，这个需要使用者自行处理。
 * 		可用于电容触摸键的检测，这种场景无需计算准确的电容值，将采样值与一个固定值进行比较即可
 * 	判断按键是否被触摸。
 * 		典型的应用电路见说明文档。采样时处于死等状态，属于耗时操作。
 *      在文件 cap_sensor_config.h 进行正确的配置。
 * 修改记录：
 * 	2021/08/19: 初版。 刘言。
 *  2022/01/17：兼容IO中断模式。黄均铭。
***********************************************************************************/
#ifndef _CAP_SENSOR_CONFIG_H_
#define _CAP_SENSOR_CONFIG_H_

#include "..\bsp\board.h"

//==============================================================================
// MCU SELECTION
// 		1 = 1T8051(N76E003) KEIL
//		2 = STM8S	IAR
//      3 = ARM Cortex-M0(+) KEIL AC6
//      4 = SC8P171xE PICC
//==============================================================================
#define _CAPSS_MCU_SELECTION	    4
//==============================================================================
// 通道数设置
//==============================================================================
#define _CAPSS_CH_NUM			    1
//==============================================================================
// 硬件加速开关
// 利用定时器捕获功能来实现硬件加速：采样只需要一次充放电。否则需要8~11次充放电。
//==============================================================================
//硬件加速开关，1-开启，0-关闭。
#define _CAPSS_EN_HW_ACC		    1	
//==============================================================================
// 计时变量位数设置
//      8 、16 或者 32
//      用于电容触摸感应时，针对8位MCU，建议尽量通过调节软硬件控制在8bits。任何MCU也需
//  要控制充放电时间，在满足精度的前提下，应该越快越好，不要让采样时间过长，建议充放电时
//  间控制在50us以内。
//      启用硬件捕获（硬件加速）时，往往需要设置为16。
//==============================================================================
#define _CAPSS_TIME_BITS            16
//==============================================================================
// 中断 API设置
//==============================================================================
#define _CapSS_DisableInt()         {T0IE = 0;PIE1 = 0;}
#define _CapSS_EnableInt()          {T0IE = 1;PIE1 = MCU_PIE1_INIT;}
//==============================================================================
// VLOAD IO口 API设置
//==============================================================================
// 设置 VLOAD 管脚推挽输出模式
#define _CapSS_VloadOutPP()         VLOAD_INIT
#define _CapSS_VloadOutHigh()		VLOAD_OUT_H
#define _CapSS_VloadOutLow()        VLOAD_OUT_L
//==============================================================================
// 硬件加速通用API设置
//==============================================================================
#if (_CAPSS_EN_HW_ACC == 1)
// 输入捕获硬件初始化。将在 CapSS_Init() 中被调用。
#define _CapSS_CaptureInit()		SoftCT_Init()
// 准备捕获。复位一些计数器或者状态。
#define _CapSS_CaptureReady()		{SoftCT_Stop();}
// 获取计数（计时）器是否溢出标志。溢出后将会停止捕获并以 _CAPSS_MAX_TIME 作为捕获值，需要调整硬件尽量避免捕获值过大或者捕获时间过长。
#define _CapSS_CaptureIsOverflow()	(SoftCT_GetEvent() == SOFTCT_EVENT_OVF)
#endif
//==============================================================================
// CH0 操作API定义
//==============================================================================
// 初始化管脚。比如开启斯密特触发器等。将在 CapSS_Init() 中被调用。
#define _CapSS_CH0Init()		    
#if (_CAPSS_EN_HW_ACC == 1)
// 管脚输出低电平。将在启动捕获前执行。
#define _CapSS_CH0OutLow()          {TCH0_PIN_OUT=0;TCH0_PIN_OUT_PP;}
// 管脚输出高电平。将在启动捕获前执行。
#define _CapSS_CH0OutHigh()		    {TCH0_PIN_OUT=1;TCH0_PIN_OUT_PP;}
// 让外设开始计数（计时）捕获上升沿。执行前管脚输出低电平，执行期间需要保持管脚输出低电平。
#define _CapSS_CH0StartREC()		{SoftCT_Run();}
// 让外设开始计数（计时）捕获下降沿。执行前管脚输出高电平，执行期间需要保持管脚输出高电平。
#define _CapSS_CH0StartFEC()		{SoftCT_Run();}
// 管脚设置为高阻状态，便于开始充电或者放电。将在启动捕获后执行，注意此时需要确保能被硬件外设捕获电平变化（注意IO功能）。
#define _CapSS_CH0InHZ()            {TCH0_PIN_IN_HZ;TCH0_PIN_INT_EN();}
// 获取捕获状态，返回true表示已捕获
#define _CapSS_CH0GetCaptureFlag()	(SoftCT_GetEvent() == SOFTCT_EVENT_CMB)
// 停止捕获计数（计时）
#define _CapSS_CH0StopCapture()		{TCH0_PIN_INT_DIS();SoftCT_Stop();}
// 获取捕获值
#define _CapSS_CH0GetCaptureValue()	SoftCT_GetCapValue()
#else
// 读取管脚电平
#define _CapSS_CH0GetLevel()		TCH0_PIN_IN
// 管脚输出低电平。需确保是推挽输出低电平。
#define _CapSS_CH0OutLow()		    {TCH0_PIN_OUT_PP;TCH0_PIN_OUT=0;}
// 管脚输出高电平。需确保是推挽输出高电平。
#define _CapSS_CH0OutHigh()		    {TCH0_PIN_OUT_PP;TCH0_PIN_OUT=1;}
// 设置管脚为高阻输入模式。
#define _CapSS_CH0InHZ()		    TCH0_PIN_IN_HZ
#endif
//==============================================================================
// CH1 操作API定义 _CAPSS_CH_NUM>1才有效
//==============================================================================
#if (_CAPSS_CH_NUM > 1)
// 初始化管脚。比如开启斯密特触发器等。将在 CapSS_Init() 中被调用。
#define _CapSS_CH1Init()		    
#if (_CAPSS_EN_HW_ACC == 1)
// 管脚输出低电平。将在启动捕获前执行。
#define _CapSS_CH1OutLow()          {TKEY_PIN_FUN_GPIO;TKEY_PIN_OUT_PP;TKEY_PIN_OUT=0;}
// 管脚输出高电平。将在启动捕获前执行。
#define _CapSS_CH1OutHigh()		    {TKEY_PIN_FUN_GPIO;TKEY_PIN_OUT_PP;TKEY_PIN_OUT=1;}
// 让外设开始计数（计时）捕获上升沿。执行前管脚输出低电平，执行期间需要保持管脚输出低电平。
#define _CapSS_CH1StartREC()		{AdvTim_SetCapEvent(M0P_ADTIM5, 1, ADVTIM_HW_TRIG_CHB_RISE); AdvTim_Run(M0P_ADTIM5);}
// 让外设开始计数（计时）捕获下降沿。执行前管脚输出高电平，执行期间需要保持管脚输出高电平。
#define _CapSS_CH1StartFEC()		{AdvTim_SetCapEvent(M0P_ADTIM5, 1, ADVTIM_HW_TRIG_CHB_FALL); AdvTim_Run(M0P_ADTIM5);}
// 管脚设置为高阻状态，便于开始充电或者放电。将在启动捕获后执行，注意此时需要确保能被硬件外设捕获电平变化（注意IO功能）。
#define _CapSS_CH1InHZ()            TKEY_PIN_FUN_CAP
// 获取捕获状态，返回true表示已捕获
#define _CapSS_CH1GetCaptureFlag()	AdvTim_GetStatusFlag(M0P_ADTIM5, ADVTIM_STF_CMB)
// 停止捕获计数（计时）
#define _CapSS_CH1StopCapture()		AdvTim_Stop(M0P_ADTIM5);
// 获取捕获值
#define _CapSS_CH1GetCaptureValue()	AdvTim_GetCapValue(M0P_ADTIM5, 1)
#else
// 读取管脚电平
#define _CapSS_CH1GetLevel()		TKEY_PIN_IN
// 管脚输出低电平。需确保是推挽输出低电平。
#define _CapSS_CH1OutLow()		    {TKEY_PIN_OUT_PP;TKEY_PIN_OUT=0;}
// 管脚输出高电平。需确保是推挽输出高电平。
#define _CapSS_CH1OutHigh()		    {TKEY_PIN_OUT_PP;TKEY_PIN_OUT=1;}
// 设置管脚为高阻输入模式。
#define _CapSS_CH1InHZ()		    TKEY_PIN_IN_HZ
#endif
#endif
//==============================================================================
// CH2 操作API定义 _CAPSS_CH_NUM>2才有效
//==============================================================================
#if (_CAPSS_CH_NUM > 2)
// 初始化管脚。比如开启斯密特触发器等。将在 CapSS_Init() 中被调用。
#define _CapSS_CH2Init()		    
#if (_CAPSS_EN_HW_ACC == 1)
// 管脚输出低电平。将在启动捕获前执行。
#define _CapSS_CH2OutLow()          {TKEY_PIN_FUN_GPIO;TKEY_PIN_OUT_PP;TKEY_PIN_OUT=0;}
// 管脚输出高电平。将在启动捕获前执行。
#define _CapSS_CH2OutHigh()		    {TKEY_PIN_FUN_GPIO;TKEY_PIN_OUT_PP;TKEY_PIN_OUT=1;}
// 让外设开始计数（计时）捕获上升沿。执行前管脚输出低电平，执行期间需要保持管脚输出低电平。
#define _CapSS_CH2StartREC()		{AdvTim_SetCapEvent(M0P_ADTIM5, 1, ADVTIM_HW_TRIG_CHB_RISE); AdvTim_Run(M0P_ADTIM5);}
// 让外设开始计数（计时）捕获下降沿。执行前管脚输出高电平，执行期间需要保持管脚输出高电平。
#define _CapSS_CH2StartFEC()		{AdvTim_SetCapEvent(M0P_ADTIM5, 1, ADVTIM_HW_TRIG_CHB_FALL); AdvTim_Run(M0P_ADTIM5);}
// 管脚设置为高阻状态，便于开始充电或者放电。将在启动捕获后执行，注意此时需要确保能被硬件外设捕获电平变化（注意IO功能）。
#define _CapSS_CH2InHZ()            TKEY_PIN_FUN_CAP
// 获取捕获状态，返回true表示已捕获
#define _CapSS_CH2GetCaptureFlag()	AdvTim_GetStatusFlag(M0P_ADTIM5, ADVTIM_STF_CMB)
// 停止捕获计数（计时）
#define _CapSS_CH2StopCapture()		AdvTim_Stop(M0P_ADTIM5);
// 获取捕获值
#define _CapSS_CH2GetCaptureValue()	AdvTim_GetCapValue(M0P_ADTIM5, 1)
#else
// 读取管脚电平
#define _CapSS_CH2GetLevel()		TKEY_PIN_IN
// 管脚输出低电平。需确保是推挽输出低电平。
#define _CapSS_CH2OutLow()		    {TKEY_PIN_OUT_PP;TKEY_PIN_OUT=0;}
// 管脚输出高电平。需确保是推挽输出高电平。
#define _CapSS_CH2OutHigh()		    {TKEY_PIN_OUT_PP;TKEY_PIN_OUT=1;}
// 设置管脚为高阻输入模式。
#define _CapSS_CH2InHZ()		    TKEY_PIN_IN_HZ
#endif
#endif

#endif
